<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>memoization</title>
</head>

<body>

</body>
<script>
    // memorization 记忆
    // 在计算机领域，记忆（memoization）是主要用于加速程序计算的一种优化技术，
    // 它使得函数避免重复演算之前已被处理过的输入，而返回已缓存的结果

    // Memoization 的原理就是把函数的每次执行结果都放入一个对象中，在接下来的执行中，在对象中查找是否已经有相应执行过的值，
    // 如果有，直接返回该值，没有才真正执行函数体的求值部分。在对象里找值是要比执行函数的速度要快的。
    // 另外，Memoization 只适用于确定性算法，对于相同的输入总是生成相同的输出，即纯函数。

    // 计算斐波那契数列
    var count = 0;
    var fibonacci = function (n) {
        count++;
        return n < 2 ? n : fibonacci(n - 2) + fibonacci(n - 1);
    }

    function memoizeFunction(func) {
        var cache = {};
        return function (key) {
            if (cache[key]) {
                return cache[key];
            }
            else {
                cache[key] = func.apply(this, arguments);
                return cache[key];
            }
        };
    }

    fibonacci = memoizeFunction(fibonacci);
    console.log(fibonacci(100));
    console.log(count);

</script>

</html>